#include"seqlist.h"
#include <stdio.h>
#include <string.h>

//1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist()        //返回的是申请空间的首地址
{
    seqlist_t* pa=(seqlist_t *)malloc(sizeof(seqlist_t));
    if(pa==NULL)
    {
        printf("分配失败\n");
        return NULL;
    }
    memset(pa,0,sizeof(*pa));
    pa->last=-1;
    return pa;
}


//2.向顺序表的指定位置插入数据
//post，下标，要插入的位置，范围0<=post<=last+1, data插入的数据
int InsertIntoSeqlist(seqlist_t *p, int post,int data){
    if((0 <= post && post <= p->last+1) && post <= MAX_ARRAY_SIZE-1){
        for(int i=p->last;i>=post;i--){
            p->data[i+1]=p->data[i];
        }
        // printf("成功在第%d位插入数据%d\n",post,data);
        p->data[post]=data;
        p->last++;
        return 0;
    }
    else{
        printf("插入失败,范围错误\n");
        return -1;
    }
}

//3.遍历顺序表sequence 顺序　list 表
void ShowSeqlist(seqlist_t *p)
{
    if(0 <= p->last && p->last <= MAX_ARRAY_SIZE-1){
        if(p->last==-1){
            printf("顺序表为空\n");
            return ;
        }
        for(int i=0;i<=p->last;i++){
            printf("%d ",p->data[i]);
        }
            printf(" 有%d个有效元素\n",p->last+1);
    }
    return;
}

//4.判断顺序表是否为满,满返回１　未满返回０
int IsFullSeqlist(seqlist_t *p){
    if (p->last == 4) {
        printf("已满\n");
        return 1; // 返回1表示顺序表已满
    } else {
        printf("未满\n");
        return 0; // 返回0表示顺序表未满
    }
}

//5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p){
    if (p->last < 0) {
        printf("此顺序表为空\n");
        return 0;
    }
    else{
        printf("此顺序表非空\n");
        return 1;
    }
}

//6.删除顺序表中指定位置的数据post删除位置
//post，下标，要插入的位置，范围0<=post<=last,
int DeletePostSeqlist(seqlist_t *p, int post){
    if((0 <= post && post <= p->last) && p->last <= MAX_ARRAY_SIZE-1){
        for(int i=post;i < p->last;i++){
            p->data[i]=p->data[i+1];
        }
        printf("成功在第%d位删除数据\n",post);
        p->last--;
        return 0;
    }
    else{
        printf("删除失败,范围错误\n");
        return -1;
    }


}

//7.清空顺序表
void ClearSeqList(seqlist_t *p){
    if(p != NULL){
        memset(p,0,sizeof(*p));
        p->last=-1;
    }
    return;
}
//8.修改指定位置的数据
int ChangePostSeqList(seqlist_t *p,int post,int data){//post被修改的位置，data修改成的数据
    if((0 <= post && post <= p->last) && p->last <= MAX_ARRAY_SIZE-1){
        p->data[post]=data;
        printf("成功将第%d位数据修改为%d\n",post,data);
        return 0;
    }
    else{
        printf("修改失败,范围错误\n");
        return -1;
    }
}
//9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t *p,int data){//data代表被查找的数据
    for (int i = 0; i <= p->last; i++) {
        if (p->data[i] == data) {
            return i;
        }
    }
    return -1;
}
